package uds.geoloc;

import java.util.ArrayList;

import uds.data.POI_Database;
import uds.data.POI_Entry;
import uds.data.UserPreference;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Spinner;
import android.widget.TextView;

//ParametresActivity est l'activité dans laquelle on règle les paramètres de l'application.
public class ParametresActivity extends Activity 
{
	// Initialisation de variables nécessaires
	private UserPreference usr_pref;
	private CheckBox chk_geolocalisation;
	private TextView txt_date_last_maj;
	private Spinner spinner_parametre;
	private POI_Database base_poi;
	private ProgressDialog myProgressDialog;
	private Context context ; 
	
	// Initialisation des valeurs nécessaires pour la ProgressBar
	public static final int MSG_ERR = 0;
	public static final int MSG_CNF = 1;
	public static final int MSG_IND = 2;
	
    public static final String TAG = "ProgressBarActivity";
    
    private ErrorStatus status;
    enum ErrorStatus {
        NO_ERROR, ERROR_1, ERROR_2
    };
	
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.parametres);
        
        // Récupération du context
        context = this ;
        
        // Initialisation de la base de données des POI
        base_poi = new POI_Database(this);
        base_poi.open();
        
        ArrayList<POI_Entry> liste_poi = base_poi.getPOI_EntryWithType("campus"); // Récupération de la liste des campus
        ArrayList<String> liste_res = new ArrayList<String>();
        int i;
        for (i=0 ; i<liste_poi.size() ; i++)
        {
        	liste_res.add(liste_poi.get(i).getName()); // Récupération de la liste des noms des campus
        }
        
        // Initialisation des composants
        Button btn_maj_poi = (Button) findViewById(R.id.btn_maj_poi);
        Button btn_restaure_pref = (Button) findViewById(R.id.btn_restaurer_pref);
        txt_date_last_maj = (TextView) findViewById(R.id.txt_date_last_maj);
        chk_geolocalisation = (CheckBox) findViewById(R.id.chkgelocalisation);
        
        // Initialisation du spinner
        spinner_parametre = (Spinner) findViewById(R.id.spinnerParametre);
        ArrayAdapter<String> objetChoix = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, liste_res);
        objetChoix.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner_parametre.setAdapter(objetChoix);
        
        // Recherches des valeurs des préférences actuelles
        usr_pref = new UserPreference(this);
        String campus_ref = usr_pref.getPreference(UserPreference.ATR_CAMPUS_REF);
        String geolocalisation = usr_pref.getPreference(UserPreference.ATR_GEOLOCALISATION);
        String derniere_maj_database = usr_pref.getPreference(UserPreference.ATR_DERNIERE_MAJ_DATABASE);
        String donnees_importees = usr_pref.getPreference(UserPreference.ATR_DONNEES_IMPORTEES);
        
        // Traitement du campus de référence
        int pos_bat = 0;
        boolean continuer_boucle = true;
        // On détermine la position du campus de référence dans liste_res
        for ( i = 0 ; i < liste_res.size() && continuer_boucle ; i++)
        {
        	if (liste_res.get(i).equals(campus_ref))
        	{
        		pos_bat = i;
        		continuer_boucle = false;
        	}
        }
        spinner_parametre.setSelection(pos_bat); // On le sélectionne
        // On initialise un OnItemSelectedListener pour le spinner
        spinner_parametre.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
        {
			@Override
			public void onItemSelected(AdapterView<?> l, View view, int position, long id) 
			{ 
				String ressource = (String) l.getSelectedItem();
				usr_pref.setPreference(UserPreference.ATR_CAMPUS_REF, ressource); // On fixe ce campus comme celui de référence
				System.out.println("Changement de campus de référence par : " + usr_pref.getPreference(UserPreference.ATR_CAMPUS_REF));
			}

			@Override
			public void onNothingSelected(AdapterView<?> l) 
			{
				System.out.println("Rien de sélectionné !");
			}
        });
        
        // Traitement de la géolocalisation
        boolean checked_geoloc = geolocalisation.equals("oui")?true:false;
        chk_geolocalisation.setChecked(checked_geoloc);
        chk_geolocalisation.setOnCheckedChangeListener(new OnCheckedChangeListener()
        {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            {
                if (isChecked)
                {
    				usr_pref.setPreference(UserPreference.ATR_GEOLOCALISATION, "oui");
    				chk_geolocalisation.setText(context.getResources().getString(R.string.desacgeolocalisation));
    				System.out.println("Changement d'activation de la géolocalisation : " + usr_pref.getPreference(UserPreference.ATR_GEOLOCALISATION));
                }
                else
                {
    				usr_pref.setPreference(UserPreference.ATR_GEOLOCALISATION, "non");
    				chk_geolocalisation.setText(context.getResources().getString(R.string.chkgeolocalisation));
    				System.out.println("Changement d'activation de la géolocalisation : " + usr_pref.getPreference(UserPreference.ATR_GEOLOCALISATION));
                }

            }
        });
        
        // Traitement de la mise à jour de la base
        txt_date_last_maj.setText("Dernière mise à jour : " + usr_pref.getPreference(UserPreference.ATR_DERNIERE_MAJ_DATABASE));
        
        btn_maj_poi.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View v) 
            {
            	DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            	    @Override
            	    public void onClick(DialogInterface dialog, int which) 
            	    {
            	        switch (which)
            	        {
            	        	case DialogInterface.BUTTON_POSITIVE:
            	        		System.out.println("Réponse ok");
            	        		compute();
            	        		break;
            	        	case DialogInterface.BUTTON_NEGATIVE:
            	        		System.out.println("Mise à jour des données annulé !");
            	        		break;
            	        }
            	    }
            	};
            	AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
            	builder.setMessage(context.getResources().getString(R.string.invite_maj)).setPositiveButton(context.getResources().getString(R.string.oui), dialogClickListener).setNegativeButton(context.getResources().getString(R.string.non), dialogClickListener).show();

            }
        });
        
        // Traitement de la remise des paramètres par défaut
        btn_restaure_pref.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View v) 
            {
            	DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            	    @Override
            	    public void onClick(DialogInterface dialog, int which) 
            	    {
            	        switch (which)
            	        {
            	        	case DialogInterface.BUTTON_POSITIVE:
            	        		usr_pref.setPreference(UserPreference.ATR_CAMPUS_REF, "Central");
            	        		usr_pref.setPreference(UserPreference.ATR_GEOLOCALISATION, "oui");
            	        		chk_geolocalisation.setChecked(true);
            	        		spinner_parametre.setSelection(1);
            	        		break;
            	        	case DialogInterface.BUTTON_NEGATIVE:
            	        		System.out.println("Changement des préférences par défaut annulé !");
            	        		break;
            	        }
            	    }
            	};
            	AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
            	builder.setMessage(context.getResources().getString(R.string.invite_restaure)).setPositiveButton(context.getResources().getString(R.string.oui), dialogClickListener).setNegativeButton(context.getResources().getString(R.string.non), dialogClickListener).show();
            }
        });
        base_poi.close();
    }
    
    // Fonction de chargement des données
    public ErrorStatus chargementDonnees() 
    {
    	DateFormat df = new DateFormat();
    	System.out.println("Mise à jour des données en cours");
    	try
		{
			if (base_poi.dropAll())
			{
				usr_pref.setPreference(UserPreference.ATR_DONNEES_IMPORTEES, "non");
				if (base_poi.initialisation_database())
				{
					System.out.println("Mise à jour des données");
					usr_pref.setPreference(UserPreference.ATR_DONNEES_IMPORTEES, "oui");
					String new_date = df.format("dd-MM-yyyy", new java.util.Date()).toString();
					usr_pref.setPreference(UserPreference.ATR_DERNIERE_MAJ_DATABASE, new_date);
					txt_date_last_maj.setText(context.getResources().getString(R.string.derniere_maj) + new_date);
				}
			}
        }
		catch(Exception e)
		{
			System.out.println(e.getMessage());
		}
    	return ErrorStatus.NO_ERROR;
    }
    
    private void compute() {
        myProgressDialog = ProgressDialog.show(this, this.getResources().getString(R.string.patientez),
                this.getResources().getString(R.string.maj), true);
     
        new Thread((new Runnable() {
            @Override
            public void run() {
            	Message msg = null;
            	System.out.println("intérieur");
            	String progressBarData = context.getResources().getString(R.string.maj);
            	
            	msg = mHandler.obtainMessage(MSG_IND, (Object) progressBarData);
            	 
                mHandler.sendMessage(msg);
                
            	status = chargementDonnees();
            	
            	if (ErrorStatus.NO_ERROR != status) {
                    Log.e(TAG, "Problème de chargements des données :" + status);
     
                    msg = mHandler.obtainMessage(MSG_ERR, "Problème de chargements des données :" + status);

                    mHandler.sendMessage(msg);
                } else {
                   
                	msg = mHandler.obtainMessage(MSG_CNF,context.getResources().getString(R.string.maj_accompli));
                       
                    mHandler.sendMessage(msg);
                }
            	
            }
        })).start();
        
    }
    
    // Implémentation du handler qui gère l'affichage ou non du ProgressDialog
    final Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            String text2display = null;
            switch (msg.what) {
            case MSG_IND:
                if (myProgressDialog.isShowing()) {
                    myProgressDialog.setMessage(((String) msg.obj));
                }
                break;
            case MSG_ERR:
                text2display = (String) msg.obj;
                System.out.println("Erreur");
                if (myProgressDialog.isShowing()) {
                    myProgressDialog.dismiss();
                }
                break;
            case MSG_CNF:
                if (myProgressDialog.isShowing()) {
                    myProgressDialog.dismiss();
                }
                break;
            default:
                break;
            }
        }
    };
	
}
